package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.TipoAverbacao;
import br.com.foxinline.enums.TipoRequerimento;
import br.com.foxinline.modelo.CaixaRequerimento;
import br.com.foxinline.servico.CaixaRequerimentoServico;
import br.com.foxinline.util.ConverterStringDate;
import br.com.foxinline.util.Msg;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.DonutChartModel;
import org.primefaces.model.chart.LineChartSeries;

/**
 *
 * @author elyjunior
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarCaixaRequerimento implements Serializable {

    @EJB
    private CaixaRequerimentoServico caixaRequerimentoServico;
    private CaixaRequerimento caixaRequerimento;
//    private LineChartSeries lineChartSeries;
    private Date dataIni, dataFim;
    private Long qtdAverbacao, qtdRevisaoAlinhamento, qtdITBI;
    private Long qtdAverbacaoDesmembramento, qtdAverbacaoTransferencia, qtdAverbacaoMudancaNome;
    private BigDecimal valorAverbacao, valorRevisaoAlinhamento, valorITBI;
    private BigDecimal valorAverbacaoDesmembramento, valorAverbacaoTransferencia, valorAverbacaoMudancaNome;
    private boolean ativaPanel;
    private DonutChartModel donutCaixaMes;
    private CartesianChartModel linearCaixaMes;

    @PostConstruct
    public void init() throws Exception {
        ativaPanel = false;
        linearCaixaMes = initLinearModel();
    }

//    public String ultimoDia(GregorianCalendar calendarioGregoriano, Calendar calendar){
//       
//        return uDia;
//    } 
    private CartesianChartModel initLinearModel() throws Exception {
        CartesianChartModel model = new CartesianChartModel();

        LineChartSeries series1 = new LineChartSeries("Averbação");
        LineChartSeries series2 = new LineChartSeries("Revisão de Alinhamento");



        Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(new Date());

        int dia = 01;
        int mes = (cal.get(Calendar.MONDAY) + 1);
        int ano = cal.get(Calendar.YEAR);

//        System.out.println(ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "4" + "/" + ano));


        series1.set("Janeiro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "1" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "1" + "/" + ano)));
        series1.set("Fevereiro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "2" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "2" + "/" + ano)));
        series1.set("Março", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "3" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "3" + "/" + ano)));
        series1.set("Abril", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "4" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "4" + "/" + ano)));
        series1.set("Maio", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "5" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "5" + "/" + ano)));
        series1.set("Junho", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "6" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "6" + "/" + ano)));
        series1.set("Julho", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "7" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "7" + "/" + ano)));
        series1.set("Agosto", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "8" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "8" + "/" + ano)));
        series1.set("Setembro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "9" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "9" + "/" + ano)));
        series1.set("Outubro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "10" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "10" + "/" + ano)));
        series1.set("Novembro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "11" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "11" + "/" + ano)));
        series1.set("Dezembro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO,
                ConverterStringDate.formataData(dia + "/" + "12" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "12" + "/" + ano)));


        series2.set("Janeiro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "1" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "1" + "/" + ano)));
        series2.set("Fevereiro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "2" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "2" + "/" + ano)));
        series2.set("Março", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "3" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "3" + "/" + ano)));
        series2.set("Abril", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "4" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "4" + "/" + ano)));
        series2.set("Maio", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "5" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "5" + "/" + ano)));
        series2.set("Junho", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "6" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "6" + "/" + ano)));
        series2.set("Julho", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "7" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "7" + "/" + ano)));
        series2.set("Agosto", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "8" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "8" + "/" + ano)));
        series2.set("Setembro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "9" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "9" + "/" + ano)));
        series2.set("Outubro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "10" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "10" + "/" + ano)));
        series2.set("Novembro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "11" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "11" + "/" + ano)));
        series2.set("Dezembro", caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO,
                ConverterStringDate.formataData(dia + "/" + "12" + "/" + ano), ConverterStringDate.formataData(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + "12" + "/" + ano)));


        model.addSeries(series1);
        model.addSeries(series2);

        return model;
    }

    public String mes(char mes) {
        String resultado = "";
        Date data = new Date();

        GregorianCalendar calendarioGregoriano = new GregorianCalendar();
        calendarioGregoriano.setTime(data);

        switch (mes) {
            case 'J':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.JANUARY);
            case 'F':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.FEBRUARY);
            case 'M':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.MARCH);
            case 'A':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.APRIL);
            case 'O':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.MAY);
            case 'U':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.JUNE);
            case 'L':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.JULY);
            case 'G':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.AUGUST);
            case 'S':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.SEPTEMBER);
            case 'B':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.OCTOBER);
            case 'N':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.NOVEMBER);
            case 'D':
                resultado += calendarioGregoriano.getActualMaximum(Calendar.DECEMBER);

        }

        return resultado;
    }

    public void pesquisarData() {

        if (dataIni == null && dataFim == null) {
            ativaPanel = false;
            Msg.messagemWarn("O Campo Data Início ou o Campo Data Fim é Obrigatório");
        } else if (dataIni != null && dataFim == null) {
            ativaPanel = true;
            qtdAverbacao = caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO, dataIni);
            valorAverbacao = caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.AVERBACAO, dataIni);
            qtdRevisaoAlinhamento = caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO, dataIni);
            valorRevisaoAlinhamento = caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO, dataIni);
            qtdAverbacaoDesmembramento = caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.DESMEMBRAMENTO, dataIni, dataFim);
            qtdAverbacaoMudancaNome = caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.MUDANCA_NOME, dataIni);
            qtdAverbacaoTransferencia = caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.TRANSFERENCIA, dataIni);
            valorAverbacaoDesmembramento = caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.DESMEMBRAMENTO, dataIni);
            valorAverbacaoMudancaNome = caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.MUDANCA_NOME, dataIni);
            valorAverbacaoTransferencia = caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.TRANSFERENCIA, dataIni);
            
//            qtdITBI = caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.ITBI, dataIni);
//            valorITBI = caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.ITBI, dataIni);

        } else if (dataIni == null && dataFim != null) {
            ativaPanel = false;
            Msg.messagemWarn("O campo Data Início é Obrigatório");
        } else {
            ativaPanel = true;
            qtdAverbacao = caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO, dataIni, dataFim);
            valorAverbacao = caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.AVERBACAO, dataIni, dataFim);
            qtdRevisaoAlinhamento = caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO, dataIni, dataFim);
            valorRevisaoAlinhamento = caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO, dataIni, dataFim);
            qtdAverbacaoDesmembramento = caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.DESMEMBRAMENTO, dataIni, dataFim);
            qtdAverbacaoMudancaNome = caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.MUDANCA_NOME, dataIni, dataFim);
            qtdAverbacaoTransferencia = caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.TRANSFERENCIA, dataIni, dataFim);
            valorAverbacaoDesmembramento = caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.DESMEMBRAMENTO, dataIni, dataFim);
            valorAverbacaoMudancaNome = caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.MUDANCA_NOME, dataIni, dataFim);
            valorAverbacaoTransferencia = caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.TRANSFERENCIA, dataIni, dataFim);
            
//            qtdITBI = caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.ITBI, dataIni);
//            valorITBI = caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.ITBI, dataIni, dataFim);
        }
    }

    public Long qtdRequerimentoAverbacao() {
        return caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.AVERBACAO, new Date());
    }

    public Long qtdTipoAverbacaoMudancaNome() {
        return caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.MUDANCA_NOME, new Date());
    }

    public Long qtdTipoAverbacaoDesmembramento() {
        return caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.DESMEMBRAMENTO, new Date());
    }

    public Long qtdTipoAverbacaoTransferencia() {
        return caixaRequerimentoServico.qtdTipoAverbacao(TipoAverbacao.TRANSFERENCIA, new Date());
    }

    public BigDecimal valorRequerimentoAverbacao() {
        return caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.AVERBACAO, new Date());
    }

    public BigDecimal valorAverbacaoMudancaNome() {
        return caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.MUDANCA_NOME, new Date());
    }

    public BigDecimal valorAverbacaoTransferencia() {
        return caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.TRANSFERENCIA, new Date());
    }

    public BigDecimal valorAverbacaoDesmembramento() {
        return caixaRequerimentoServico.qtdSomaTipoAverbacao(TipoAverbacao.DESMEMBRAMENTO, new Date());
    }

    public Long qtdRequerimentoITBI() {
        return caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.ITBI, new Date());
    }

    public BigDecimal valorRequerimentoITBI() {
        return caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.ITBI, new Date());
    }

    public Long qtdRequerimentoRevisaoAlinhamento() {
        return caixaRequerimentoServico.qtdTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO, new Date());
    }

    public BigDecimal valorRequerimentoRevisaoAlinhamento() {
        return caixaRequerimentoServico.qtdSomaTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO, new Date());
    }

    public Date getDataIni() {
        return dataIni;
    }

    public void setDataIni(Date dataIni) {
        this.dataIni = dataIni;
    }

    public Date getDataFim() {
        return dataFim;
    }

    public void setDataFim(Date dataFim) {
        this.dataFim = dataFim;
    }

    public Long getQtdAverbacao() {
        return qtdAverbacao;
    }

    public void setQtdAverbacao(Long qtdAverbacao) {
        this.qtdAverbacao = qtdAverbacao;
    }

    public Long getQtdRevisaoAlinhamento() {
        return qtdRevisaoAlinhamento;
    }

    public void setQtdRevisaoAlinhamento(Long qtdRevisaoAlinhamento) {
        this.qtdRevisaoAlinhamento = qtdRevisaoAlinhamento;
    }

    public Long getQtdITBI() {
        return qtdITBI;
    }

    public void setQtdITBI(Long qtdITBI) {
        this.qtdITBI = qtdITBI;
    }

    public BigDecimal getValorAverbacao() {
        return valorAverbacao;
    }

    public void setValorAverbacao(BigDecimal valorAverbacao) {
        this.valorAverbacao = valorAverbacao;
    }

    public BigDecimal getValorRevisaoAlinhamento() {
        return valorRevisaoAlinhamento;
    }

    public void setValorRevisaoAlinhamento(BigDecimal valorRevisaoAlinhamento) {
        this.valorRevisaoAlinhamento = valorRevisaoAlinhamento;
    }

    public BigDecimal getValorITBI() {
        return valorITBI;
    }

    public void setValorITBI(BigDecimal valorITBI) {
        this.valorITBI = valorITBI;
    }

    public boolean isAtivaPanel() {
        return ativaPanel;
    }

    public void setAtivaPanel(boolean ativaPanel) {
        this.ativaPanel = ativaPanel;
    }

    public CartesianChartModel getLinearCaixaMes() {
        return linearCaixaMes;
    }

    public void setLinearCaixaMes(CartesianChartModel linearCaixaMes) {
        this.linearCaixaMes = linearCaixaMes;
    }

    public Long getQtdAverbacaoDesmembramento() {
        return qtdAverbacaoDesmembramento;
    }

    public void setQtdAverbacaoDesmembramento(Long qtdAverbacaoDesmembramento) {
        this.qtdAverbacaoDesmembramento = qtdAverbacaoDesmembramento;
    }

    public Long getQtdAverbacaoTransferencia() {
        return qtdAverbacaoTransferencia;
    }

    public void setQtdAverbacaoTransferencia(Long qtdAverbacaoTransferencia) {
        this.qtdAverbacaoTransferencia = qtdAverbacaoTransferencia;
    }

    public Long getQtdAverbacaoMudancaNome() {
        return qtdAverbacaoMudancaNome;
    }

    public void setQtdAverbacaoMudancaNome(Long qtdAverbacaoMudancaNome) {
        this.qtdAverbacaoMudancaNome = qtdAverbacaoMudancaNome;
    }

    public BigDecimal getValorAverbacaoDesmembramento() {
        return valorAverbacaoDesmembramento;
    }

    public void setValorAverbacaoDesmembramento(BigDecimal valorAverbacaoDesmembramento) {
        this.valorAverbacaoDesmembramento = valorAverbacaoDesmembramento;
    }

    public BigDecimal getValorAverbacaoTransferencia() {
        return valorAverbacaoTransferencia;
    }

    public void setValorAverbacaoTransferencia(BigDecimal valorAverbacaoTransferencia) {
        this.valorAverbacaoTransferencia = valorAverbacaoTransferencia;
    }

    public BigDecimal getValorAverbacaoMudancaNome() {
        return valorAverbacaoMudancaNome;
    }

    public void setValorAverbacaoMudancaNome(BigDecimal valorAverbacaoMudancaNome) {
        this.valorAverbacaoMudancaNome = valorAverbacaoMudancaNome;
    }
    
    
}
